<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>递归函数</title>
</head>
<body>
    <script>
        //递归函数是在一个函数通过名字调用自身的情况下构成的
        //经典案例阶乘
        function jiecheng(number){
            if (number<=1) {
                return 1;
            }else{
                return number*jiecheng(number-1)
            }
        }
        // 处理过程
        // number--->4[传进去的值]
        // number 不<=1 return 4 * jiecheng(number-1)
        //                     number--->3[传进去的值]
        //                     number 不<=1 return 3 * jiecheng(number-1)
        //                                                 number--->2[传进去的值]
        //                                                 number 不<=1 return 2 * jiecheng(number-1)
        //                                                                     number--->1[传进去的值]
        //                                                                     return 1
        //     总过程 return 4*3*2*1

        //函数耦合问题[引用清除]
        function jiejia(number){
            if (number<=1) {
                return 1;
            }else{
                return number+jiejia(number-1)
            }
        }
        //var makeadd=jiejia;
        //jiejia=null;//此时函数清除  makeadd中引用的jiejia消失了
        //console.log(makeadd);
        //makeadd(3);

        function jiejia(number){
            if (number<=1) {
                return 1;
            }else{
                return number+jiejia(number-1)
            }
        }
        //再带缓存处理
        function fac(number){
            if (isFinite(number) && number > 0) {
                if (! (number in fac)) {
                    fac[number]= number * fac(number-1);
                    //console.log(factory[number]);
                }
                return fac[number];
            } else {
                return NaN;
            }
        }
        fac[1]=1;
        function factorial(n) {
            if (isFinite(n) && n > 0 && n == Math.round(n)) {
                if (!(n in factorial)) {//如果没有缓存结果{
                    factorial[n] =n * factorial(n-1);
                    console.log(factorial[n]);
                }
                return factorial[n];
             
            }else{
                return NaN;
            }
        }
        //必须要有初始化   factorial[1]=1; 不然 偶后面
        factorial[1]=1;
        // factorial[2]=2;

        // 函数调用自身 arguments.callee   函数调用自身
        //解决函数清楚问题
        function add(n){
            if (n<=1) {
                return 1
            } else {
                return n+arguments.callee(n-1)
            }
        }
        var makeadd=add;
        jiejia=null;//此时函数清除  makeadd中引用的jiejia消失了
        console.log(makeadd);
        makeadd(3);
        //严格模式通过在脚本或函数的头部添加 "use strict"; 表达式来声明
//在严格模式下，不能通过脚本访问 arguments.callee，访问这个属性会导致错误


    </script>
</body>
</html>